#include <stdio.h>

// 参数是数组
void printArr1(int x, int y, int arr[x][y])
{
    for(int i=0;i<x;i++){
        for (int j = 0; j < y; j++) {
            printf("%d ",arr[i][j]);
        }
        printf("\n");
    }
}
// 参数是指针
void printArr2(int x, int y, int (*p)[y])
{
    for (int i = 0; i < x; i++) {
        for (int j = 0; j < y; j++) {
            // p是首元素（第一行）的地址
            // +i 是获取每一行
            // 解引用获取每一行（一维数组）的地址
            printf("%d ", (*(p + i))[j]);
            printf("%d ", *(*(p + i) + j));
            printf("%d ", *(p[i] + j));
            printf("%d ", p[i][j]);
        }
        printf("\n");
    }
}

// 参数是指针
void printArr3(int x, int y, int (*p)[y])
{
    for (int i = 0; i < x; i++)
    {
        for (int j = 0; j < y; j++)
        {
            // p是首元素（第一行）的地址，
            // +i 获得每一行，
            // 解引用获取每一行（一维数组）的地址
            // +j 是获得每一行第j个元素的地址
            // *解引用获得 第i j个元素的地址
            printf("%d ", *(*(p+i)+j));
        }
        printf("\n");
    }
}

int main()
{
    // 二维数组arr的首元素是{1, 2, 3, 4, 5}
    int arr[][5] = {{1, 2, 3, 4, 5}, { 6, 7, 8, 9, 10}};
    printArr1(2, 5, arr);
    printf("=========================\n");
    printArr2(2, 5, arr); // 入参是地址
    printf("=========================\n");
    printArr3(2, 5, arr);
    return 0;
}
